간단한 PyJWT 레거시 코드 수정 경험
🤔 문제
PyJWT를 활용하여 JWT(JSON Web Token)를 만들고 있었는데 에러가 떴다.
token = jwt.encode(payload, app.config['JWT_SECRET_KEY'], 'HS256')
return jsonify({'access_token': token.decode('UTF-8')})
AttributeError: 'str' object has no attribute 'decode'
"책의 코드와 똑같이 썼는데 뭐지?"라고 생각하면서 일단 코드를 잘못 썼을 수도 있으니 책에서 주어진 코드를 복붙했다. 그래도 에러는 다시 나타났다.
🚩 해결
에러가 다시 나타나니 방법은 구글링 밖에 없었다. 바로 stackoverflow가 뜨길래 해결은 깔끔하게 됐다.
token = jwt.encode(payload, app.config['JWT_SECRET_KEY'], 'HS256')
return jsonify({'access_token': token})
그냥 decode를 지워주면 되는 문제였다. 근데 '왜 decode가 붙어있던걸까?'라는 의문이 들었고 stackoverflow를 계속 탐험했다.
대충 버전과 관련있어 보이는 답변을 발견했고, 바로 공식문서를 읽어보는 방법을 선택했다. 현재 내가 쓰고 있는 버전은 2.1.0으로 가장 최근 버전이다. 저 코드가 레거시 코드라는 예상을 해보고 PyJWT 공식 문서의 Changelog를 읽어봤다.
역시나 내 예상은 맞았다. v2.0.0으로 바뀌면서 jwt.encode(...)
의 return type이 바뀌었다는 것. 예전에는 토큰의 타입을 byte string으로 return했었던 것 같다. 현재는 str 타입으로 return되고 파이썬에서 모든 문자열은 UTF-8이므로 딱히 저걸 decode할 필요가 없다는 의미이다.
🏴 간단한 고찰
역시 책을 읽으면서 공부하는 방법도 장점만 있는 것이 아니다. 얼마나 오래 됐느냐에 따라서 레거시 코드가 존재할 수도 있다. 책으로 공부하려면 가장 최근에 나온 책을 먼저 읽어보는 것이 좋을듯하다.